package com.hnhegui.backend.system.mapper;

import com.hnhegui.backend.system.entity.User;
import org.apache.ibatis.jdbc.SQL;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;

/**
 * 用户SQL动态构建器
 */
public class UserSqlProvider {

    /**
     * 动态构建用户查询SQL
     */
    public String searchUsers(String username, String phone, Integer status, String role, 
                             LocalDateTime startTime, LocalDateTime endTime, 
                             Integer offset, Integer limit) {
        return new SQL() {{
            SELECT("*");
            FROM("t_user");
            
            // 用户名模糊查询
            if (username != null && !username.trim().isEmpty()) {
                WHERE("username LIKE CONCAT('%', #{username}, '%')");
            }
            
            // 手机号精确查询
            if (phone != null && !phone.trim().isEmpty()) {
                WHERE("phone = #{phone}");
            }
            
            // 状态精确查询
            if (status != null) {
                WHERE("status = #{status}");
            }
            
            // 角色精确查询
            if (role != null && !role.trim().isEmpty()) {
                WHERE("role = #{role}");
            }
            
            // 时间区间查询
            if (startTime != null && endTime != null) {
                WHERE("create_time BETWEEN #{startTime} AND #{endTime}");
            } else if (startTime != null) {
                WHERE("create_time >= #{startTime}");
            } else if (endTime != null) {
                WHERE("create_time <= #{endTime}");
            }
            
            // 按创建时间降序排序
            ORDER_BY("create_time DESC");
            
            // 分页
            if (limit != null && offset != null) {
                LIMIT(limit);
                OFFSET(offset);
            }
        }}.toString();
    }

    /**
     * 动态构建用户计数SQL
     */
    public String countUsers(String username, String phone, Integer status, String role, 
                            LocalDateTime startTime, LocalDateTime endTime) {
        return new SQL() {{
            SELECT("COUNT(*)");
            FROM("t_user");
            
            // 用户名模糊查询
            if (username != null && !username.trim().isEmpty()) {
                WHERE("username LIKE CONCAT('%', #{username}, '%')");
            }
            
            // 手机号精确查询
            if (phone != null && !phone.trim().isEmpty()) {
                WHERE("phone = #{phone}");
            }
            
            // 状态精确查询
            if (status != null) {
                WHERE("status = #{status}");
            }
            
            // 角色精确查询
            if (role != null && !role.trim().isEmpty()) {
                WHERE("role = #{role}");
            }
            
            // 时间区间查询
            if (startTime != null && endTime != null) {
                WHERE("create_time BETWEEN #{startTime} AND #{endTime}");
            } else if (startTime != null) {
                WHERE("create_time >= #{startTime}");
            } else if (endTime != null) {
                WHERE("create_time <= #{endTime}");
            }
        }}.toString();
    }

    /**
     * 批量插入用户SQL
     * 动态构建批量INSERT语句，提高插入性能
     *
     * @param params 参数Map，包含users列表
     * @return 批量INSERT SQL语句
     */
    public String batchInsert(Map<String, Object> params) {
        @SuppressWarnings("unchecked")
        List<User> users = (List<User>) params.get("users");
        
        if (users == null || users.isEmpty()) {
            throw new IllegalArgumentException("用户列表不能为空");
        }

        StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO t_user (username, password, phone, email, role, status, create_time, update_time) VALUES ");

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        for (int i = 0; i < users.size(); i++) {
            User user = users.get(i);
            
            if (i > 0) {
                sql.append(", ");
            }

            sql.append("(");
            sql.append("'").append(escapeString(user.getUsername())).append("', ");
            sql.append("'").append(escapeString(user.getPassword())).append("', ");
            sql.append("'").append(escapeString(user.getPhone())).append("', ");
            sql.append("'").append(escapeString(user.getEmail())).append("', ");
            sql.append("'").append(user.getRole().name()).append("', ");
            sql.append(user.getStatus()).append(", ");
            sql.append("'").append(user.getCreateTime().format(formatter)).append("', ");
            sql.append("'").append(user.getUpdateTime().format(formatter)).append("'");
            sql.append(")");
        }

        return sql.toString();
    }

    /**
     * 转义SQL字符串中的特殊字符
     *
     * @param str 原始字符串
     * @return 转义后的字符串
     */
    private String escapeString(String str) {
        if (str == null) {
            return "";
        }
        return str.replace("'", "''").replace("\\", "\\\\");
    }
}
